{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn import datasets\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "from dnn_utils import sigmoid, sigmoid_backward, relu, relu_backward, tanh, tanh_backward"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(-10, 10, 500)\n",
    "y_forward, _ = sigmoid(x)\n",
    "y_backward = sigmoid_backward(1, x)\n",
    "plt.plot(x, y_forward, label='sigmoid_forward')\n",
    "plt.plot(x, y_backward, label='sigmoid_backward')\n",
    "plt.legend(loc='best')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "y_forward, _ = tanh(x)\n",
    "y_backward = tanh_backward(1, x)\n",
    "plt.plot(x, y_forward, label='sigmoid_forward')\n",
    "plt.plot(x, y_backward, label='sigmoid_backward')\n",
    "plt.legend(loc='best')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD4CAYAAAD1jb0+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3dd3hUZfrG8e9LKKEZkN6DSm9JiCAgKOquigICFgRsKP4AkbIqWNZVcbEt64ororiKuiCgKKgIVpCiqJBCCL0FCCCEEkhCAinv74+ELMQEhkw5M8n9uS6uhDlnzrlzJvPknffMPMdYaxERkcBTxukAIiJSPCrgIiIBSgVcRCRAqYCLiAQoFXARkQBV1pc7q1mzpg0NDfXlLkVEAl5UVNQha22tgrf7tICHhoayZs0aX+5SRCTgGWN2FXa7plBERAKUCriISIBSARcRCVA+nQMvTGZmJomJiWRkZDgdRRwQHBxMw4YNKVeunNNRRAKO4wU8MTGRqlWrEhoaijHG6TjiQ9ZaDh8+TGJiIk2bNnU6jkjAOe8UijHmPWPMQWNM/Bm3XWyM+c4YszXva/XiBsjIyKBGjRoq3qWQMYYaNWro1ZdIMbkyB/4+cEOB2x4HfrDWNgN+yPt/sal4l1567EWK77wF3Fq7HDhS4Oa+wAd5338A3OLhXCIiJUJGZjbPfrGeI2mnPL7t4r4LpY61dj9A3tfaRa1ojHnQGLPGGLMmKSmpmLsTEQlMTy+I54NVCcTvPebxbXv9bYTW2unW2khrbWStWn/4JKjfeuCBB9iwYYNX99GrVy+Sk5P/cPuzzz7L5MmTi7zfpk2bCAsLIzw8nO3bt3szokuqVKnidAQRvzR39W4+iUrk4Z6X0aO55+tfcd+FcsAYU89au98YUw846MlQ/uA///mP1/exaNGiYt1vwYIF9O3bl+eee86l9a21WGspU8b9v9dZWVmULev4m5dE/F783mM8/fl6ujeryZjrmntlH8V9Jn4B3AO8lPf1c0+Eee7L9WzYd9wTm8rXuv5FPNO7zTnXSUtL4/bbbycxMZHs7Gyefvpppk2bxuTJk4mMjOTdd9/l5Zdfpn79+jRr1owKFSrwxhtvcO+991KxYkU2bdrErl27mDFjBh988AGrVq2ic+fOvP/++wDMnj2bF154AWstN910Ey+//DLwv94wNWvWZNKkSXz44Yc0atSIWrVq0bFjx0KzLlq0iNdee42goCCWL1/O0qVLefXVV3nvvfeA3FcOY8eOJSEhgRtvvJGePXuyatUqxo4dy9q1a3n11VeZMmUKU6ZMYceOHWzfvp177rmHlStXMnHiRL788kvS09Pp2rUrb7/9NsYYrr76arp27cpPP/1Enz596N+/P4MGDSIrK4sbbih4fltEjqVnMnJWNDUql+e1O8IIKuOdk/WuvI1wNrAKaGGMSTTG3E9u4f6TMWYr8Ke8/wesr7/+mvr167N27Vri4+PPKkr79u3j+eef55dffuG7775j06ZNZ9336NGjLFmyhH/961/07t2bcePGsX79etatW0dsbCz79u1jwoQJLFmyhNjYWFavXs2CBQvO2kZUVBRz5swhJiaGzz77jNWrVxeZtVevXgwfPpxx48axdOlSoqKimDFjBr/++iu//PIL77zzDjExMQBs3ryZu+++m5iYGK6//npWrFgBwIoVK6hRowZ79+5l5cqVdO/eHYBRo0axevVq4uPjSU9PZ+HChfn7TU5OZtmyZTzyyCOMGTOGESNGsHr1aurWrevewRcpYXJyLI98vJZ9yem8MSiCGlUqeG1f5x2BW2vvLGLRtR7Oct6Rsre0a9eORx99lAkTJnDzzTfnFzSA3377jauuuoqLL74YgNtuu40tW7bkL+/duzfGGNq1a0edOnVo164dAG3atCEhIYFdu3Zx9dVXc3r+f/DgwSxfvpxbbvnfG3dWrFhBv379qFSpEgB9+vRxOfvKlSvp168flStXBqB///6sWLGCPn360KRJE6644goA6tatS2pqKikpKezZs4dBgwaxfPlyVqxYQf/+/QFYunQpr7zyCidOnODIkSO0adOG3r17A3DHHXfk7/Onn37i008/BeCuu+5iwoQJLucVKeneXr6D7zce4JnerenYpNgfkXGJeqEAzZs3Jyoqinbt2vHEE08wceLE/GXW2nPet0KF3L+uZcqUyf/+9P+zsrLOe//Tivt+6HNt/3RRP61Lly7MmDGDFi1a0L17d1asWMGqVavo1q0bGRkZjBw5knnz5rFu3TqGDRt21gdsCm5L798W+aNV2w/zj282cVP7etzbNdTr+1MBJ3eapFKlSgwZMoRHH32U6Ojo/GWdOnVi2bJlHD16lKysrPyRp6s6d+7M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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "y_forward, _ = relu(x)\n",
    "y_backward = relu_backward(np.ones(x.shape), x)\n",
    "plt.plot(x, y_forward, label='sigmoid_forward')\n",
    "plt.plot(x, y_backward, label='sigmoid_backward')\n",
    "plt.legend(loc='best')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
